package com.gitee.sop.layui.adminserver.module.background.admin.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.gitee.sop.layui.adminserver.module.background.admin.entity.SysMenu;
import com.gitee.sop.layui.adminserver.module.base.bo.ZTreeNode;
import com.gitee.sop.layui.adminserver.module.base.vo.MenuTreeVo;

import java.util.List;
import java.util.Map;

/**
 * com.zch.admin.base.entity.SysMenu模型业务接口
 *
 * @author: admin
 * @date: 2019-11-14
 * @version: 1.0.0
 */
public interface SysMenuService extends IService<SysMenu> {

    /**
     * 添加菜单
     *
     * @param parentId 上级id
     * @param sysMenu  菜单信息
     */
    String add(int parentId, SysMenu sysMenu);

    /**
     * 删除指定id菜单和其所有孩子节点
     *
     * @param id 菜单id
     */
    void deleteSelfAndChildrenById(int id);

    /**
     * 查询指定用户可用的垂直菜单树
     *
     * @return
     */
    List<MenuTreeVo> searchVerticalMenuTree();

    /**
     * 查询指定用户可用的指定菜单的子菜单水平菜单树
     *
     * @param menuId 指定菜单
     * @return
     */
    List<MenuTreeVo> searchLevelMenuTree(int menuId);

    /**
     * 查询指定角色的菜单
     *
     * @param appId    应用id
     * @param roleUuid 角色uuid
     * @return
     */
    List<ZTreeNode> searchMenuTreeByRoleUuid(String appId, String roleUuid);

    /**
     * 获取当前用户的所有的菜单，并按照相同等级菜单的sort字段排序
     *
     * @param appId 应用id ，可为null，默认获取当前应用信息
     * @return
     */
    List<Map<String, Object>> getListAndOrderPidSortByAppId(String appId);

    /**
     * 获取指定pid下排序值最大的菜单
     *
     * @param pid   父id
     * @param appId 应用id ，可为null，默认获取当前应用信息
     * @return
     */
    SysMenu getOneMaxSortMenuByAppIdAndPid(String appId, int pid);

    /**
     * 获取指定菜单列表的数据
     *
     * @param uuidList 菜单uuid列表
     * @return
     */
    List<SysMenu> getListByUuid(List<String> uuidList);

    /**
     * 获取指定菜单信息
     *
     * @param appId      应用id
     * @param menuIdList 菜单id列表
     * @return
     */
    List<SysMenu> getListByAppIdAndIds(String appId, List<Integer> menuIdList);

    /**
     * 获取第一层级指定名称指定创建用户指定应用的数据
     *
     * @param appId        应用id
     * @param creatorUuid  创建用户
     * @param menuNameList 菜单名称列表
     * @return
     */
    List<SysMenu> getTopListByAppIdAndCreatorUuidAndNames(String appId, String creatorUuid, List<String> menuNameList);

    /**
     * 获取当前用户菜单作为应用模板使用
     *
     * @return
     */
    List<ZTreeNode> getMenuTreeForUseTemplate();

    /**
     * 使用当前用户的菜单模板为指定应用新建菜单
     *
     * @param appId
     * @param menuIdList
     */
    void setMenuByUseMenuTemplate(String appId, List<Integer> menuIdList);

    /**
     * 向指定的上级id，追加菜单
     *
     * @param parentMenuId 上级id
     * @param name         新增菜单名
     * @param uri          请求地址
     * @param description  新增菜单描述
     * @param icon
     * @return
     */
    String append(int parentMenuId, String name, String uri, String description, String icon);

    /**
     * 删除指定菜单及其子菜单
     *
     * @param menuUuid 菜单uuid
     */
    void deleteSelfAndChildrenByUuid(String menuUuid);

    /**
     * 删除指定应用的指定菜单
     *
     * @param appId        应用id
     * @param menuUuidList 菜单uuid列表
     */
    void deleteInUuid(String appId, List<String> menuUuidList);

    /**
     * 获取指定uuid的数据
     *
     * @param menuUuid
     * @return
     */
    SysMenu getOneByUuid(String menuUuid);

    /**
     * 获取指定应用的菜单信息
     *
     * @param appId
     * @return
     */
    List<SysMenu> getListByAppId(String appId);
}